package java_thinking.unit_14._14_2;

/**
 * @Description :
 * ？ 表示不确定的java类型。
 * T  表示指定java类型。
 *  单独的T 代表一个类型 而 Class<T>和Class<?>代表这个类型所对应的类
 *      Object类中包含一个方法名叫getClass，利用这个方法就可以获得一个实例的类型类。
 *      类型类指的是代表一个类型的类，因为一切皆是对象，类型也不例外，在Java使用类型类来表示一个类型。
 *      所有的类型类都是Class类的实例。getClass() 会看到返回Class<?>
 *      public final native Class<?> getClass()
 *
 * K V 分别代表java键值中的Key Value。
 * E 代表Element。
 * @author: cww
 * @DateTime: 2019/3/26 19:32
 */

interface HasBatteries {}
interface Waterproof {}
interface Shoots {}

class FancyToy extends Toy implements HasBatteries, Waterproof, Shoots {
    FancyToy() { super(1); }
}

 class E01 {
    static void printInfo(Class<?> cc) {
        System.out.println("Class name: " + cc.getName()  +" is interface? [" + cc.isInterface() + "]");
        System.out.println("Simple name: " + cc.getSimpleName());
        System.out.println("Canonical name : " + cc.getCanonicalName());

        System.out.println("===============================");
    }
    public static void main(String[] args) {
        Class<?> c = null;
        try {
            c = Class.forName("java_thinking.unit_14._14_2.FancyToy");
        } catch(ClassNotFoundException e) {
            System.out.println("Can't find FancyToy");
            return;
        }
        printInfo(c);
        //获取接口list
        for(Class<?> face : c.getInterfaces())
            printInfo(face);
        //获取父类
        Class<?> up = c.getSuperclass();
        Object obj = null;
        try {
            // Requires default constructor:
            obj = up.newInstance();
        } catch(InstantiationException e) {
            System.out.println("Cannot instantiate");
            return;
        } catch(IllegalAccessException e) {
            System.out.println("Cannot access");
            return;
        }
        printInfo(obj.getClass());
    }
}
